using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;

/// <summary>
/// 实时显示当前日期、星期和时间，并在日期变化时自动更新。
/// 适用于 UI 文本组件（TMP_Text）。
/// </summary>
public class DateAndDayOfWeek : MonoBehaviour
{
    /// <summary>
    /// 用于显示日期和时间的 TMP_Text 组件
    /// </summary>
    private TMP_Text dateText;

    /// <summary>
    /// 当前日期（用于判断是否需要更新日期）
    /// </summary>
    private DateTime currentDate;

    /// <summary>
    /// 格式化后的日期和星期信息
    /// </summary>
    private string formattedDateAndDayOfWeek;

    /// <summary>
    /// 允许外部配置 12/24 小时格式
    /// </summary>
    public bool use12HourFormat = false;

    /// <summary>
    /// 允许外部修改日期格式
    /// </summary>
    public string dateFormat = "yyyy-MM-dd";

    /// <summary>
    /// 允许外部修改语言（默认中文）
    /// </summary>
    public string language = "zh";

    /// <summary>
    /// 星期几的多语言映射
    /// </summary>
    private static readonly Dictionary<string, string[]> dayOfWeekTranslations = new Dictionary<string, string[]>
    {
        { "zh", new string[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" } },
        { "en", new string[] { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" } }
    };

    private void Awake()
    {
        // 获取 TMP_Text 组件
        dateText = GetComponent<TMP_Text>();

        if (dateText == null)
        {
            Debug.LogError("DateAndDayOfWeek: 未找到 TMP_Text 组件！");
            enabled = false;
            return;
        }

        // 获取当前日期
        currentDate = DateTime.Now;

        // 初始化日期和星期信息
        UpdateDateAndDayOfWeek();
    }

    private void Update()
    {
        // 获取当前时间
        DateTime now = DateTime.Now;

        // 检查日期是否变化，避免不必要的更新
        if (now.Date != currentDate.Date)
        {
            currentDate = now;
            UpdateDateAndDayOfWeek();
        }

        // 更新时间显示
        UpdateTime(now);
    }

    /// <summary>
    /// 更新日期和星期信息
    /// </summary>
    private void UpdateDateAndDayOfWeek()
    {
        // 根据用户配置的日期格式格式化日期
        string formattedDate = currentDate.ToString(dateFormat);

        // 获取当前星期信息（根据语言设置）
        string dayOfWeekStr = ConvertDayOfWeek(currentDate.DayOfWeek);

        // 组合日期和星期几的信息
        formattedDateAndDayOfWeek = $"{formattedDate} {dayOfWeekStr}";
    }

    /// <summary>
    /// 更新当前时间，并刷新 UI 显示
    /// </summary>
    /// <param name="time">当前时间</param>
    private void UpdateTime(DateTime time)
    {
        // 格式化时间为 12/24 小时制
        string timeString = use12HourFormat ? time.ToString("hh:mm:ss tt") : time.ToString("HH:mm:ss");

        // 更新 TMP_Text 组件的文本
        dateText.text = $"{formattedDateAndDayOfWeek} {timeString}";
    }

    /// <summary>
    /// 将 DayOfWeek 转换为指定语言的星期几
    /// </summary>
    /// <param name="dayOfWeek">系统 DayOfWeek 枚举</param>
    /// <returns>对应的星期几字符串</returns>
    private string ConvertDayOfWeek(DayOfWeek dayOfWeek)
    {
        return dayOfWeekTranslations.ContainsKey(language) ? dayOfWeekTranslations[language][(int)dayOfWeek] : dayOfWeek.ToString();
    }
}